// /*
// 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数，使它们的和与 target 最接近。
// 返回这三个数的和。
// 假定每组输入只存在恰好一个解。
// 示例 1：
// 输入：nums = [-1,2,1,-4], target = 1
// 输出：2
// 解释：与 target 最接近的和是 2 (-1 + 2 + 1 = 2)。

// 示例 2：
// 输入：nums = [0,0,0], target = 1
// 输出：0
// */

// /**
//  * @param {number[]} nums
//  * @param {number} target
//  * @return {number}
//  */

// var threeSumClosest = function (nums, target) {
//   //先排序 初始化一个target值 先固定一个遍历 利用双指针
//   nums.sort((a, b) => (a - b)).reverse()
//   console.log(nums);
//   let result = nums[0] + nums[1] + nums[2]
//   for (let idx = 0; idx < nums.length; idx++) {
//     let left = idx + 1;
//     let right = nums.length - 1;
//     console.log(left, ':left and right:', right);
//     // 循环
//     while (left < right) {
//       console.log(result);
//       if (Math.abs(nums[idx] + nums[right] + nums[right] - target) < Math.abs(result - target)) {
//         result = nums[idx] + nums[left] + nums[right]
//       }
//       if (nums[idx] + nums[left] + nums[right] < target) {
//         left++
//       } else if (nums[idx] + nums[left] + nums[right] > target) {
//         right--
//       } else {
//         return result
//       }
//     }
//   }
//   return result
// };

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var threeSumClosest = function (nums, target) {
  var min = Infinity;
  var res = 0;
  nums.sort((a, b) => (a - b))

  for (var i = 0; i < nums.length - 2; i++) {
    if (nums[i - 1] !== undefined && nums[i - 1] === nums[i]) {
      continue;
    }
    var curr = nums[i];
    var m = i + 1;
    var n = nums.length - 1;
    while (m < n) {
      var tmp = Math.abs(nums[m] + nums[n] + curr - target);
      if (tmp < min) {
        min = tmp;
        res = nums[m] + nums[n] + curr;
      }

      if (nums[m] + nums[n] + curr < target) {
        m++;
      } else {
        n--;
      }
    }
  }
  return res;

};


console.log(threeSumClosest([0, 2, 1, -3], 1));